//
//  TableViewController.swift
//  TSKit
//
//  Created by chenyusen on 2018/3/23.
//

import UIKit
import MJRefresh

open class TableViewController: ModelViewController, UITableViewDelegate {
    
    /// 下拉刷新控件
    public var refreshHeaderClass: MJRefreshHeader.Type = MJRefreshNormalHeader.self
    
    /// 上拉加载更多控件
    public var refreshFooterClass: MJRefreshFooter.Type = MJRefreshAutoNormalFooter.self
    
    
    /// 是否支持下拉刷新
    public var canDragRefresh = false

    /// 下拉刷新是否是为了加载更多(例如微博)
    public var isDragRefreshForMore = false
    
    /// 是否支持上拉加载更多
    public var canDragLoadMore = false
    
    public var emptyView: UIView?
    
    
    /// 首次刷新数据的样式, 默认为YES 显示Loading toast, 否则会以下拉刷新的形式展示刷新页面
    public var isPrefersDefaultLoading = true
    
    /// 标志是否暂时隐藏tableview若当前页面首次刷新数据时是以默认loading加载时.   默认不隐藏
    public var isClearTableViewWhenLoadingNew = false
    
    /// tableView的style, 请在初始化方法里设置
    public var tableViewStyle: UITableViewStyle = .plain
    
    
    /// 当前控制器所持有的tableView
    lazy public var tableView: UITableView = {
        let aTableView = UITableView(frame: CGRect(x: 0, y: topOffset, width: view.width, height: view.height - topOffset), style: tableViewStyle)
        
        if #available(iOS 11.0, *) {
            aTableView.contentInsetAdjustmentBehavior = .never
            aTableView.estimatedRowHeight = 0
        } else {
            self.automaticallyAdjustsScrollViewInsets = false
        }
        aTableView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        aTableView.backgroundColor = .clear
        aTableView.separatorStyle = .none
        tableViewModel = TableViewModel()
        tableViewAction = TableViewAction(dataSource: tableViewModel, targetForward: self)
        aTableView.delegate = tableViewAction
        aTableView.dataSource = tableViewModel
        return aTableView
    }()
    
    public var tableViewAction: TableViewAction!
    public var tableViewModel: TableViewModel!
    lazy public var pageProvider: PageProvider = {
        return PageProvider()
    } ()
    
    
    /// 用于标志当前上拉加载更多是否已经到头
    public var hasMore = false
    
    override open func loadView() {
        super.loadView()
        view.addSubview(tableView)
        
    }
    
    override open func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override open func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if flag.isShowingModel {
            tableView.flashScrollIndicators()
        }
    }
    
    deinit {
        tableView.delegate = nil
        tableView.dataSource = nil
        errorView?.removeFromSuperview()
        errorView = nil
        emptyView?.removeFromSuperview()
        emptyView = nil
    }
    
    private func setTableViewHeaderIfNeeded() {
        if canDragRefresh && tableView.mj_header == nil {
            tableView.mj_header = refreshHeaderClass.init(refreshingBlock: { [weak self] in
                guard let sSelf = self else { return }
                if sSelf.tableView.mj_footer.isRefreshing || sSelf.model.isLoading {
                    sSelf.tableView.mj_header.endRefreshing()
                    return
                }
                sSelf.model.load(more: sSelf.isDragRefreshForMore)
            })
        }
        
    }
    
    private func setTableViewFooterIfNeeded() {
        if canDragLoadMore && tableView.mj_footer == nil && model.isLoaded && canShowModel() {
            tableView.mj_footer = refreshFooterClass.init(refreshingBlock: { [weak self] in
                guard let sSelf = self else { return }
                if sSelf.tableView.mj_header.isRefreshing || sSelf.model.isLoading { // 如果header正在刷新 或则 没有header时, 模型正在刷新, 则取消此次操作
                    sSelf.tableView.mj_footer.endRefreshing()
                    return
                }
                sSelf.model.load(more: true)
            })
        }
    }
    
    public func scrollToTopAndRefresh() {
        tableView.mj_header.beginRefreshing()
    }
    
    override func didLoadModel(isFirstTime: Bool) {
        super.didLoadModel(isFirstTime: isFirstTime)
        setTableViewFooterIfNeeded()
        if tableView.mj_footer != nil {
            // 如果没有更多数据, 则上拉加载更多控件显示无更多数据
            hasMore ? tableView.mj_footer.resetNoMoreData() : tableView.mj_footer.endRefreshingWithNoMoreData()
        }
    }
    
    override open func dataModel(didStartLoad model: DataModelCompatible) {
        setTableViewHeaderIfNeeded()
        if tableView.mj_header != nil && !tableView.mj_header.isRefreshing && !model.isLoadingMore && !isPrefersDefaultLoading {
            let refreshingBlock = tableView.mj_header.refreshingBlock
            tableView.mj_header.refreshingBlock = nil
            tableView.mj_header.beginRefreshing()
            // mmp,mjrefresh开始调用block要等动画结束才执行,为了保证时序, 先截断一次, 延迟0.1秒开始放入block
            delay(Double(MJRefreshFastAnimationDuration) + 0.1, task: { [weak self] in
                guard let sSelf = self else { return }
                sSelf.tableView.mj_header.refreshingBlock = refreshingBlock
            })
        }
        super .dataModel(didStartLoad: model)
    }
    
    override open func dataModel(_ model: DataModelCompatible, didFinishLoad data: Any?) {
        if tableView.mj_header != nil && tableView.mj_header.isRefreshing { // 如果是header在动画, 那么请求来自下拉刷新
            tableView.mj_header.endRefreshing()
            if !isDragRefreshForMore {
                tableViewModel.removeAll()
            }
        } else if tableView.mj_footer != nil && tableView.mj_footer.isRefreshing { // 如果是footer在动画, 那么请求来自上拉加载更多
            tableView.mj_footer.endRefreshing()
        } else {
            tableViewModel.removeAll()
        }
        super.dataModel(model, didFinishLoad: data)
    }
    
    override open func dataModel(_ model: DataModelCompatible, didFailLoad error: Error) {
        super.dataModel(model, didFailLoad: error)
        if tableView.mj_header != nil && tableView.mj_header.isRefreshing {
            tableView.mj_header.endRefreshing()
        } else {
            if tableView.mj_footer != nil && tableView.mj_footer.isRefreshing {
                tableView.mj_footer.endRefreshing()
            }
        }
    }
    
    override open func showLoading(_ show: Bool, text: String? = nil) {
        if show {
            // 如果数据还没有加载过, 并且要求默认形式暂时
            if !model.isLoaded && isPrefersDefaultLoading {
                if isClearTableViewWhenLoadingNew {
                    tableView.isHidden = true
                }
                super.showLoading(show)
            }
        } else {
            super.showLoading(show)
            if isClearTableViewWhenLoadingNew && isPrefersDefaultLoading {
                tableView.isHidden = false
            }
        }
    }
    
    override open func canShowModel() -> Bool {
        
        return tableViewModel.cellItems().count > 0
//        return true
    }
    
    
    override open func showModel(_ show: Bool) {
        if show {
            tableView.reloadData()
        }
    }
    
    override open func didShowModel(isFirstTime: Bool) {
        super .didShowModel(isFirstTime: isFirstTime)
        if !isViewAppearing && isFirstTime {
            tableView.flashScrollIndicators()
        }
    }
    
    override open func showEmpty(_ show: Bool) {
        if show {
            emptyView = StateView(title: DefaultConfig.Text.empty, image: DefaultConfig.Image.empty)
            emptyView?.frame = CGRect(x: 0, y: topOffset, width: view.frame.width, height: view.frame.height - topOffset)
            emptyView?.autoresizingMask = [.flexibleWidth, .flexibleHeight]
            tableView.isHidden = true
        } else {
            emptyView?.removeFromSuperview()
            emptyView = nil
            tableView.isHidden = false
        }
    }
}
